home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / util / pack / xfdmaster.lha / xfd / Developer / Sources / ASM / PCompress2.a < prev    next >
Text File  |  1999-02-05  |  18KB  |  854 lines

  1. * Programmheader
  2. *
  3. *    Name:        PCompress2
  4. *    Author:        SDI
  5. *    Distribution:    PD
  6. *    Description:    XFD external decruncher for recognising PCompress2
  7. *    Compileropts:    -
  8. *    Linkeropts:    -
  9. *
  10. * 1.0   06.08.98 : first version
  11. * 1.1   07.08.98 : added FALH and optimized FALH and CheckSum for FALH
  12. * 1.2   08.08.98 : a lot of optimizations
  13. * 1.3   02.10.98 : optimizations
  14.  
  15.         INCLUDE    "AINCLUDE:IncDirs.i"
  16.         INCLUDE    "lvo.i"
  17.  
  18.         INCLUDE    "libraries/xfdmaster.i"
  19.         INCLUDE    "exec/memory.i"
  20.  
  21.         * head function for tests
  22. *        INCLUDE    "xfdExeHead.a"
  23.  
  24. ForeMan        MOVEQ    #-1,D0        ;security
  25.         RTS
  26.  
  27.         DC.L    XFDF_ID
  28.         DC.W    1,0
  29.         DC.L    0,0,Slave_PCompHILH
  30.  
  31.         DC.B    "$VER: PCompress2 1.3 (02.10.1998) by SDI",0
  32. N_PCompressHILH    DC.B    'PCompress HILH Data',0
  33. N_PCompressFALH    DC.B    'PCompress FALH Data',0
  34.         EVEN
  35.  
  36. Slave_PCompHILH    DC.L    Slave_PCompFALH    ;next slave
  37.         DC.W    2        ;version
  38.         DC.W    38        ;master version
  39.         DC.L    N_PCompressHILH    ;name
  40.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  41.         DC.W    0
  42.         DC.L    RB_PCompHILH    ;recog buffer
  43.         DC.L    DB_PComp    ;decrunch buffer
  44.         DC.L    0        ;recog segment
  45.         DC.L    0        ;decrunch segment
  46.         DC.W    0,0
  47.         DC.L    14        ;MinBufSize
  48.  
  49. Slave_PCompFALH    DC.L    0        ;next slave
  50.         DC.W    2        ;version
  51.         DC.W    38        ;master version
  52.         DC.L    N_PCompressFALH    ;name
  53.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  54.         DC.W    0
  55.         DC.L    RB_PCompFALH    ;recog buffer
  56.         DC.L    DB_PComp    ;decrunch buffer
  57.         DC.L    0        ;recog segment
  58.         DC.L    0        ;decrunch segment
  59.         DC.W    0,0
  60.         DC.L    14        ;MinBufSize
  61.  
  62. *************************************************************************
  63. *    Recog buffer function: receives buffer + length in A0/D0    *
  64. *    and receives pointer to struct RecogResult in A1        *
  65. *************************************************************************
  66.  
  67. RB_PCompHILH    MOVEQ    #0,D0            ; False
  68.  
  69. * optional    DC.L    'PRE',byte-num
  70. * file format:    DC.B    'HILH'
  71. *        DC.L    original length
  72. *        DC.L    compressed length
  73. *        DC.W    checksum
  74.  
  75.         CMP.W    #"PR",(A0)
  76.         BNE.B    .normal
  77.         CMP.B    #'E',2(A0)
  78.         BNE.B    .No
  79.         ADDQ.L    #4,A0
  80. .normal        CMP.L    #"HILH",(A0)
  81.         BNE.B    .No
  82.         MOVE.L    4(A0),D1
  83.         CMP.L    8(A0),D1    * source greater than destination
  84.         BLE.B    .No
  85.         MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  86.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  87.         MOVEQ    #1,D0            ; True
  88. .No        RTS
  89.  
  90. *************************************************************************
  91. *    Recog buffer function: receives buffer + length in A0/D0    *
  92. *    and receives pointer to struct RecogResult in A1        *
  93. *************************************************************************
  94.  
  95. RB_PCompFALH    MOVEQ    #0,D0            ; False
  96.  
  97. * optional    DC.L    'PRE',byte-num
  98. * file format:    DC.B    'FALH'
  99. *        DC.L    original length
  100. *        DC.L    size of compress data part 1
  101. *        DC.W    checksum
  102.  
  103.         CMP.W    #"PR",(A0)
  104.         BNE.B    .normal
  105.         CMP.B    #'E',2(A0)
  106.         BNE.B    .No
  107.         ADDQ.L    #4,A0
  108. .normal        CMP.L    #"FALH",(A0)
  109.         BNE.B    .No
  110.         MOVE.L    4(A0),D1
  111.         CMP.L    8(A0),D1    * source greater than destination
  112.         BLE.B    .No
  113.         MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  114.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  115.         MOVEQ    #1,D0            ; True
  116. .No        RTS
  117.  
  118. *************************************************************************
  119. *          decrunch buffer function for uncrunched files        *
  120. *           receives xfdbiBufferInfo in A0 and bufferpos in A1        *
  121. *************************************************************************
  122.  
  123. DB_PComp    MOVEM.L    D4/A2/A4-A6,-(A7)
  124.         MOVE.L    xfdbi_SourceBuffer(A0),A4
  125.         MOVE.L    A0,A5
  126.         MOVE.L    4.W,A6
  127.  
  128.         CMP.W    #"PR",(A4)        * skip PRE0 or PRE1 header
  129.         BNE.B    .calldecr
  130.         ADDQ.L    #4,A4
  131.  
  132. .calldecr    MOVE.W    #XFDERR_NOMEMORY,xfdbi_Error(A5)
  133.         MOVE.L    4(A4),D0
  134.         MOVE.L    xfdbi_UserTargetBuf(A5),A2
  135.         MOVE.L    D0,xfdbi_TargetBufSaveLen(A5)
  136.  
  137.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  138.         BNE.B    .Decrunch
  139.  
  140.         MOVE.L    D0,xfdbi_TargetBufLen(A5)
  141.         MOVE.L    xfdbi_TargetBufMemType(A5),D1
  142.         JSR    _LVOAllocMem(A6)
  143.         MOVE.L    D0,xfdbi_TargetBuffer(A5)
  144.         BEQ.B    .End
  145.         MOVE.L    D0,A2
  146.  
  147. .Decrunch    MOVEM.L    D2-D7/A2-A6,-(A7)
  148.         CMP.W    #'HI',(A4)
  149.         BNE.B    .falh
  150.         BSR.B    DecompHILH
  151.         BRA.B    .next
  152. .falh        BSR.W    DecompFALH
  153. .next        MOVEM.L    (A7)+,D2-D7/A2-A6
  154.         CLR.W    xfdbi_Error(A5)
  155.         MOVEA.L    xfdbi_TargetBufSaveLen(A5),D4
  156.         BSR.W    GetCheckSum
  157.         CMP.W    12(A4),D0
  158.         BEQ.B    .ok
  159.         MOVE.W    #XFDERR_CORRUPTEDDATA,xfdbi_Error(A5)
  160.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  161.         BNE.B    .skip
  162.         MOVE.L    A2,A1
  163.         MOVE.L    D4,D0
  164.         JSR    _LVOFreeMem(A6)
  165. .skip        MOVEQ    #0,D0
  166.         BRA.B    .End
  167. .ok        MOVEQ    #1,D0
  168. .End        MOVEM.L    (A7)+,D4/A2/A4-A6
  169.         RTS
  170.  
  171. *************************************************************************
  172. *         decrunch routine for HILH data                *
  173. *                                    *
  174. * This is made of reassembled code from PCompress2 and P-Reader.    *
  175. * I removed a lot of obsolete stuff and made the routine mem to mem    *
  176. * decrunching. Thus it should be a lot shorter and faster. I hope I     *
  177. * catched all the stuff and did not miss any obsolete code.        *
  178. *                                    *
  179. * I think I also removed a bug. I tried PCompress2 with WordWorth7.01   *
  180. * executable (972972 bytes) and it fails after circa 300000 bytes. My   *
  181. * decruncher has no problems with this :-)                *
  182. *                                    *
  183. *    gets following parameters:                    *
  184. *        A4    source buffer                    *
  185. *        A2    destination buffer                *
  186. *************************************************************************
  187.  
  188. DecompHILH    LINK    A5,#-$0018
  189.         CLR.L    -4(A5)
  190.         CLR.L    -$000C(A5)
  191.         MOVE.L    4(A4),-8(A5)        * source size
  192.         LEA    14(A4),A4        * source buffer
  193.         MOVE.L    (A4)+,-$0014(A5)
  194.  
  195.         MOVE.L    #$844,D0
  196.         MOVE.L    #MEMF_CLEAR,D1
  197.         MOVE.L    4.W,A6
  198.         JSR    _LVOAllocMem(A6)
  199.         MOVEA.L    D0,A3
  200.         TST.L    D0
  201.         BEQ.B    .end
  202.         BSR.B    DecrunchHILH
  203.         MOVE.L    #$844,D0
  204.         MOVEA.L    A3,A1
  205.         MOVE.L    4.W,A6
  206.         JSR    _LVOFreeMem(A6)
  207. .end        UNLK    A5
  208.         RTS
  209.  
  210. DecrunchHILH    SUBA.L    A6,A6            * current file size
  211.         MOVEQ    #0,D2
  212. DeHILH1     CMPI.W    #$0020,D2
  213.         BLT.B    DeHILH2
  214.         CMPI.W    #$007E,D2
  215.         BGT.B    DeHILH2
  216.         MOVEQ    #3,D0
  217.         BRA.B    DeHILH3
  218. DeHILH2        MOVEQ    #1,D0
  219. DeHILH3        MOVE.W    D2,D1
  220.         ADDI.W    #$01F8,D1
  221.         EXT.L    D1
  222.         ASL.L    #1,D1
  223.         MOVE.W    D0,(A3,D1.L)
  224.         ADDQ.W    #1,D2
  225.         CMPI.W    #$0105,D2
  226.         BLT.B    DeHILH1
  227.         MOVE.W    #1,$0702(A3)
  228.         MOVE.W    #1,$05F8(A3)
  229.         BSR.W    HILHsub5
  230.         MOVE.L    #$80000000,$0840(A3)
  231.         BRA.W    HILH19
  232. HILH01        MOVE.L    -$000C(A5),D0
  233.         CMP.L    A6,D0
  234.         BHI.B    HILH02
  235.         BSR.W    HILHsub3
  236.         MOVE.L    D0,-$000C(A5)
  237.         BRA.B    HILH01
  238. HILH02        CLR.L    -$0010(A5)
  239.         CLR.L    -$0018(A5)
  240.         BSR.W    HILHsub6
  241.         MOVE.W    D0,-2(A5)
  242.         CMPI.W    #$0100,-2(A5)
  243.         BGE.B    HILH03
  244.         MOVE.L    A6,D0
  245.         ADDQ.L    #1,A6
  246.         MOVE.B    -1(A5),(A2,D0.L)
  247.         BRA.W    HILH20
  248. HILH03        CMPI.W    #$0104,D0
  249.         BGE.B    HILH06
  250.         SUBI.W    #$0100,D0
  251.         MOVE.W    D0,-$000E(A5)
  252.         ADDQ.W    #2,D0
  253.         BSR.W    HILHsub1
  254.         MOVE.W    -$000E(A5),D1
  255.         BSR.W    HILHsub2
  256.         MOVE.W    D0,-$0010(A5)
  257.         ADDQ.W    #2,-$0010(A5)
  258. HILH04        MOVE.L    A6,D0
  259.         LEA    (A2,D0.L),A1
  260.         LEA    -1(A2,D0.L),A0
  261. HILH05        MOVE.W    -$0010(A5),D0
  262.         BEQ.W    HILH20
  263.         SUBQ.W    #1,-$0010(A5)
  264.         MOVE.B    (A0)+,(A1)+
  265.         ADDQ.L    #1,A6
  266.         BRA.B    HILH05
  267. HILH06        CMPI.W    #$0105,-2(A5)
  268.         BGE.B    HILH07
  269.         MOVE.W    #$0010,D0
  270.         BSR.W    HILHsub1
  271.         MOVE.W    D0,-$0010(A5)
  272.         BRA.B    HILH04
  273. HILH07        CMPI.W    #$0135,-2(A5)
  274.         BGE.B    HILH09
  275.         SUBI.W    #$0103,D0
  276.         MOVE.W    D0,-$0016(A5)
  277.         MOVEQ    #0,D3
  278. HILH08        CMPI.L    #2,D3
  279.         BEQ.W    HILH20
  280.         MOVE.L    A6,D0
  281.         MOVE.L    D0,D1
  282.         MOVE.L    -$0018(A5),D2
  283.         SUB.L    D2,D0
  284.         MOVE.B    (A2,D0.L),(A2,D1.L)
  285.         ADDQ.L    #1,A6
  286.         ADDQ.L    #1,D3
  287.         BRA.B    HILH08
  288. HILH09        CMPI.W    #$0151,-2(A5)
  289.         BGE.B    HILH12
  290.         SUBI.W    #$0135,D0
  291.         MOVE.W    D0,-$000E(A5)
  292.         LSR.W    #2,D0
  293.         BSR.W    HILHsub1
  294.         ASL.W    #2,D0
  295.         MOVE.W    D0,D7
  296.         MOVE.W    -$000E(A5),D0
  297.         ANDI.W    #3,D0
  298.         OR.W    D0,D7
  299.         MOVE.W    D7,D0
  300.         MOVE.W    -$000E(A5),D1
  301.         LSR.W    #2,D1
  302.         BSR.W    HILHsub2
  303.         MOVE.W    D0,-$0016(A5)
  304.         ADDQ.W    #3,-$0016(A5)
  305.         MOVE.W    #3,-$0010(A5)
  306. HILH10        MOVE.L    A6,D3
  307.         LEA    (A2,D3.L),A1
  308.         MOVE.L    -$0018(A5),D2
  309.         SUB.L    D2,D3
  310.         LEA    (A2,D3.L),A0
  311. HILH11        MOVE.W    -$0010(A5),D0
  312.         BEQ.W    HILH20
  313.         SUBQ.W    #1,-$0010(A5)
  314.         MOVE.B    (A0)+,(A1)+
  315.         ADDQ.L    #1,A6
  316.         ADDQ.L    #1,D3
  317.         BEQ.B    HILH10
  318.         BRA.B    HILH11
  319. HILH12        CMPI.W    #$0189,-2(A5)
  320.         BGE.B    HILH13
  321.         SUBI.W    #$0151,D0
  322.         MOVE.W    D0,-$0016(A5)
  323.         MOVEQ    #0,D0
  324.         MOVE.W    -$0016(A5),D0
  325.         DIVU    #$000E,D0
  326.         MOVE.W    D0,-$000E(A5)
  327.         SWAP    D0
  328.         MOVE.W    D0,-$0016(A5)
  329.         MOVE.W    -$000E(A5),D0
  330.         ADDQ.W    #2,D0
  331.         BSR.W    HILHsub1
  332.         MOVE.W    -$000E(A5),D1
  333.         BSR.W    HILHsub2
  334.         MOVE.W    D0,-$0010(A5)
  335.         MOVE.W    -$0016(A5),D0
  336.         ADDQ.W    #2,D0
  337.         BSR.W    HILHsub1
  338.         MOVE.W    -$0016(A5),D1
  339.         BSR.W    HILHsub2
  340.         MOVE.W    D0,-$0016(A5)
  341.         ADDQ.W    #8,-$0010(A5)
  342.         MOVE.W    -$0010(A5),D0
  343.         ADD.W    D0,-$0016(A5)
  344.         BRA.W    HILH10
  345. HILH13        CMPI.W    #$018A,-2(A5)
  346.         BGE.B    HILH14
  347.         MOVE.W    #$0010,D0
  348.         BSR.W    HILHsub1
  349.         MOVE.W    D0,-$0010(A5)
  350.         MOVE.W    #$0010,D0
  351.         BSR.W    HILHsub1
  352.         MOVE.W    D0,-$0016(A5)
  353.         BRA.W    HILH10
  354. HILH14        CMPI.W    #$01A4,-2(A5)
  355.         BGE.B    HILH15
  356.         MOVEQ    #4,D2
  357.         MOVE.W    #$018A,D3
  358.         BRA.B    HILH18
  359. HILH15        CMPI.W    #$01C0,-2(A5)
  360.         BGE.B    HILH16
  361.         MOVEQ    #5,D2
  362.         MOVE.W    #$01A4,D3
  363.         BRA.B    HILH18
  364. HILH16        CMPI.W    #$01DC,-2(A5)
  365.         BGE.B    HILH17
  366.         MOVEQ    #6,D2
  367.         MOVE.W    #$01C0,D3
  368.         BRA.B    HILH18
  369. HILH17        MOVEQ    #7,D2
  370.         MOVE.W    #$01DC,D3
  371. HILH18        SUB.W    D3,D0
  372.         MOVE.W    D0,-$000E(A5)
  373.         LSR.W    #1,D0
  374.         ADDQ.W    #1,D0
  375.         BSR.B    HILHsub1
  376.         ASL.W    #1,D0
  377.         MOVE.W    D0,D7
  378.         MOVE.W    -$000E(A5),D0
  379.         ANDI.W    #1,D0
  380.         OR.W    D0,D7
  381.         MOVE.W    D7,D0
  382.         MOVE.W    -$000E(A5),D1
  383.         LSR.W    #1,D1
  384.         BSR.W    HILHsub2
  385.         ADD.W    D2,D0
  386.         MOVE.W    D0,-$0016(A5)
  387.         MOVE.W    D2,-$0010(A5)
  388.         BRA.W    HILH10
  389. HILH19        CMP.L    -8(A5),A6
  390.         BLT.W    HILH01
  391. HILH20        ADDQ.W    #1,-4(A5)
  392.         CMPI.W    #$07D0,-4(A5)
  393.         BLT.B    HILH21
  394.         CLR.W    -4(A5)
  395. HILH21        CMP.L    -8(A5),A6
  396.         BLT.W    HILH01
  397.         RTS    
  398.  
  399. HILHsub1    MOVEQ    #0,D4
  400.         MOVE.W    D0,D3
  401. HILHsub1_1    MOVE.W    D3,D0
  402.         SUBQ.W    #1,D3
  403.         TST.W    D0
  404.         BEQ.B    HILHsub1_2
  405.         BSR.B    HILHsub1_3
  406.         MOVE.W    D4,D1
  407.         ASL.W    #1,D1
  408.         OR.W    D1,D0
  409.         MOVE.W    D0,D4
  410.         BRA.B    HILHsub1_1
  411. HILHsub1_2    MOVE.W    D4,D0
  412.         RTS
  413. HILHsub1_3    MOVEQ    #0,D1
  414.         MOVE.L    $0840(A3),D0
  415.         LSR.L    #1,D0
  416.         MOVE.L    D0,$0840(A3)
  417.         MOVE.L    -$0014(A5),D0
  418.         CMP.L    $0840(A3),D0
  419.         BCS.B    HILHsub1_4
  420.         MOVEQ    #1,D1
  421.         MOVE.L    $0840(A3),D0
  422.         SUB.L    D0,-$0014(A5)
  423. HILHsub1_4    CMPI.L    #$01000000,$0840(A3)
  424.         BCC.B    HILHsub1_5
  425.         MOVE.L    -$0014(A5),D0
  426.         ASL.L    #8,D0
  427.         MOVE.L    D0,-$0014(A5)
  428.         MOVEQ    #0,D0
  429.         MOVE.B    (A4)+,D0
  430.         OR.L    D0,-$0014(A5)
  431.         MOVE.L    $0840(A3),D0
  432.         ASL.L    #8,D0
  433.         MOVE.L    D0,$0840(A3)
  434.         BRA.B    HILHsub1_4
  435. HILHsub1_5    MOVE.W    D1,D0
  436.         RTS    
  437.  
  438. HILHsub2    LEA    HILHData(PC),A0
  439.         ASL.W    #1,D1
  440.         MOVE.W    (A0,D1.W),D1
  441.         ADD.W    D1,D0
  442.         RTS    
  443.  
  444. HILHsub3    MOVEM.L    D1-D6,-(A7)
  445.         MOVEQ    #0,D6
  446.         MOVE.L    D0,D6
  447.         CMPI.L    #$00000030,D6
  448.         BGE.B    HILHsub3_1
  449.         ADDI.L    #$00000105,D0
  450.         BSR.W    HILHsub3_12
  451. HILHsub3_1    MOVEQ    #4,D2
  452.         MOVEQ    #0,D4
  453.         BRA.B    HILHsub3_3
  454. HILHsub3_2    MOVE.L    D2,D0
  455.         ASL.L    #1,D0
  456.         MOVE.L    D0,D2
  457.         ADDQ.W    #1,D4
  458. HILHsub3_3    MOVE.L    D6,D0
  459.         ADDQ.L    #4,D0
  460.         CMP.L    D0,D2
  461.         BLT.B    HILHsub3_2
  462.         CMP.L    D2,D0
  463.         BNE.B    HILHsub3_8
  464.         CMPI.W    #$000E,D4
  465.         BGE.B    HILHsub3_8
  466.         CMPI.W    #$000D,D4
  467.         BGE.B    HILHsub3_4
  468.         MOVE.W    D4,D0
  469.         ASL.W    #1,D0
  470.         MOVE.L    D0,D3
  471.         ADDI.W    #$018A,D0
  472.         BSR.W    HILHsub3_12
  473.         ADDQ.W    #1,D0
  474.         BSR.W    HILHsub3_12
  475. HILHsub3_4    MOVE.W    D4,D0
  476.         ASL.W    #1,D0
  477.         ADDI.W    #$01A4,D0
  478.         BSR.B    HILHsub3_12
  479.         ADDQ.W    #1,D0
  480.         BSR.B    HILHsub3_12
  481.         ADDI.W    #$001B,D0
  482.         BSR.B    HILHsub3_12
  483.         ADDQ.W    #1,D0
  484.         BSR.B    HILHsub3_12
  485.         ADDI.W    #$001B,D0
  486.         BSR.B    HILHsub3_12
  487.         ADDQ.W    #1,D0
  488.         BSR.B    HILHsub3_12
  489.         CMPI.W    #7,D4
  490.         BGE.B    HILHsub3_6
  491.         MOVEQ    #0,D5
  492. HILHsub3_5    MOVE.W    D4,D0
  493.         ASL.W    #2,D0
  494.         ADD.W    D5,D0
  495.         ADDI.W    #$0135,D0
  496.         BSR.B    HILHsub3_12
  497.         ADDQ.W    #1,D5
  498.         CMPI.W    #4,D5
  499.         BLT.B    HILHsub3_5
  500. HILHsub3_6    MOVEQ    #0,D5
  501. HILHsub3_7    MOVE.W    D5,D0
  502.         MULS    #$000E,D0
  503.         ADD.W    D4,D0
  504.         ADDI.W    #$0151,D0
  505.         BSR.B    HILHsub3_12
  506.         ADDQ.W    #1,D5
  507.         CMPI.W    #4,D5
  508.         BLT.B    HILHsub3_7
  509. HILHsub3_8    MOVE.L    D6,D0
  510.         ADDQ.L    #1,D0
  511.         CMP.L    #$00000030,D0
  512.         BGE.B    HILHsub3_10
  513. HILHsub3_9    MOVEM.L    (A7)+,D1-D6
  514.         RTS    
  515. HILHsub3_10    MOVE.L    D6,D0
  516.         ADDQ.L    #1,D0
  517.         CMP.L    #$00000030,D0
  518.         BNE.B    HILHsub3_11
  519.         MOVEQ    #$003C,D0
  520.         BRA.B    HILHsub3_9
  521. HILHsub3_11    MOVE.L    D6,D0
  522.         ADDQ.L    #4,D0
  523.         ASL.L    #1,D0
  524.         SUBQ.L    #4,D0
  525.         BRA.B    HILHsub3_9
  526. HILHsub3_12    MOVE.L    D0,-(A7)
  527.         ADDI.W    #$01F8,D0
  528. HILHsub3_13    TST.W    D0
  529.         BEQ.B    HILHsub3_14
  530.         MOVE.W    D0,D1
  531.         ASL.W    #1,D1
  532.         ADDQ.W    #1,(A3,D1.L)
  533.         ASR.W    #1,D0
  534.         BRA.B    HILHsub3_13
  535. HILHsub3_14    CMPI.W    #$2000,2(A3)
  536.         BCS.B    HILHsub3_15
  537.         BSR.B    HILHsub4
  538. HILHsub3_15    MOVE.L    (A7)+,D0
  539.         RTS    
  540.  
  541. HILHsub4    MOVE.L    D4,-(A7)
  542.         MOVE.W    #$01F8,D4
  543. HILHsub4_1    MOVE.W    D4,D0
  544.         ASL.W    #1,D0
  545.         TST.W    (A3,D0.W)
  546.         BEQ.B    HILHsub4_2
  547.         MOVE.W    (A3,D0.W),D2
  548.         LSR.W    #1,D2
  549.         ADDQ.W    #1,D2
  550.         MOVE.W    D2,(A3,D0.L)
  551. HILHsub4_2    ADDQ.W    #1,D4
  552.         CMP.W    #$03F0,D4
  553.         BLT.B    HILHsub4_1
  554.         BSR.B    HILHsub5
  555.         MOVE.L    (A7)+,D4
  556.         RTS    
  557.  
  558. HILHsub5    MOVE.W    #$01F7,D5
  559.         MOVEQ    #0,D3
  560. HILHsub5_1    MOVE.W    D5,D0
  561.         ASL.W    #1,D0
  562.         MOVE.W    D0,D1
  563.         ASL.W    #1,D1
  564.         MOVE.W    D0,D2
  565.         ADDQ.W    #1,D2
  566.         ASL.W    #1,D2
  567.         MOVE.W    (A3,D1.W),D3
  568.         ADD.W    (A3,D2.W),D3
  569.         MOVE.W    D3,(A3,D0.L)
  570.         SUBQ.W    #1,D5
  571.         CMPI.W    #1,D5
  572.         BGE.B    HILHsub5_1
  573.         RTS    
  574.  
  575. HILHsub6    BSR.B    HILHsub6_6
  576.         MOVE.W    D0,D6
  577.         MOVEM.L    D4-D6,-(A7)
  578.         MOVE.W    2(A3),D0
  579.         MOVEQ    #$000A,D1
  580.         LSR.W    D1,D0
  581.         MOVE.W    D0,D5
  582.         ADDQ.W    #3,D5
  583.         ADDI.W    #$01F8,D6
  584. HILHsub6_1    TST.W    D6
  585.         BEQ.B    HILHsub6_2
  586.         MOVE.W    D6,D0
  587.         EXT.L    D0
  588.         ASL.L    #1,D0
  589.         ADD.W    D5,(A3,D0.L)
  590.         ASR.W    #1,D6
  591.         BRA.B    HILHsub6_1
  592. HILHsub6_2    CMPI.W    #$2000,2(A3)
  593.         BCS.B    HILHsub6_3
  594.         BSR.W    HILHsub4
  595. HILHsub6_3    MOVEM.L    (A7)+,D4-D6
  596. HILHsub6_4    CMPI.L    #$01000000,$0840(A3)
  597.         BCC.B    HILHsub6_5
  598.         MOVE.L    -$0014(A5),D0
  599.         ASL.L    #8,D0
  600.         MOVE.L    D0,-$0014(A5)
  601.         MOVEQ    #0,D0
  602.         MOVE.B    (A4)+,D0
  603.         OR.L    D0,-$0014(A5)
  604.         MOVE.L    $0840(A3),D0
  605.         ASL.L    #8,D0
  606.         MOVE.L    D0,$0840(A3)
  607.         BRA.B    HILHsub6_4
  608. HILHsub6_5    MOVE.W    D6,D0
  609.         RTS    
  610. HILHsub6_6    MOVEM.L    D2-D7,-(A7)
  611.         MOVEQ    #0,D4
  612.         MOVEQ    #0,D5
  613.         MOVE.W    2(A3),D3
  614.         MOVEQ    #0,D2
  615. HILHsub6_7    CMPI.W    #$01F8,D2
  616.         BGE.B    HILHsub6_8
  617.         MOVE.L    $0840(A3),D7
  618.         MOVEQ    #0,D0
  619.         MOVE.W    D2,D0
  620.         ASL.W    #2,D0
  621.         MOVEQ    #0,D1
  622.         MOVE.W    D4,D1
  623.         ADD.W    (A3,D0.W),D1
  624.         BSR.B    HILHsub6_9
  625.         MOVE.L    D0,D6
  626.         ASL.W    #1,D2
  627.         MOVE.L    -$0014(A5),D1
  628.         CMP.L    D0,D1
  629.         BCS.B    HILHsub6_7
  630.         MOVE.L    D6,D5
  631.         MOVE.W    D2,D0
  632.         ASL.W    #1,D0
  633.         ADD.W    (A3,D0.W),D4
  634.         ADDQ.W    #1,D2
  635.         BRA.B    HILHsub6_7
  636. HILHsub6_8    MOVE.L    D5,D0
  637.         SUB.L    D0,-$0014(A5)
  638.         MOVE.W    D2,D0
  639.         ASL.W    #1,D0
  640.         MOVEQ    #0,D1
  641.         MOVE.W    (A3,D0.W),D1
  642.         BSR.B    HILHsub6_9
  643.         MOVE.L    D0,$0840(A3)
  644.         MOVE.W    D2,D0
  645.         SUBI.W    #$01F8,D0
  646.         MOVEM.L    (A7)+,D2-D7
  647.         RTS    
  648. HILHsub6_9    MOVEM.L    D2-D3,-(A7)
  649.         MOVE.L    D1,D2
  650.         SWAP    D2
  651.         DIVU    D3,D2
  652.         MOVE.L    D2,D1
  653.         SWAP    D1
  654.         CLR.W    D2
  655.         DIVU    D3,D2
  656.         MOVE.W    D2,D1
  657.         MOVE.L    D7,D3
  658.         MOVEQ    #0,D0
  659.         MOVE.L    D1,D2
  660.         SWAP    D2
  661.         MULU    D3,D2
  662.         SWAP    D2
  663.         MOVE.W    D2,D0
  664.         SWAP    D3
  665.         MOVE.L    D3,D2
  666.         MULU    D1,D2
  667.         CLR.W    D2
  668.         SWAP    D2
  669.         ADD.L    D2,D0
  670.         SWAP    D1
  671.         MULU    D3,D1
  672.         ADD.L    D1,D0
  673.         MOVEM.L    (A7)+,D2-D3
  674.         RTS    
  675.  
  676. HILHData    DC.W    0,4,$C,$1C,$3C,$7C,$FC,$1FC,$3FC,$7FC,$FFC,$1FFC
  677.         DC.W    $3FFC,$7FFC,-4
  678.  
  679. *************************************************************************
  680. *         decrunch routine for FALH data                *
  681. *                                    *
  682. * This is made of reassembled code from PCompress2 and P-Reader.    *
  683. * I removed a lot of obsolete stuff and made the routine mem to mem    *
  684. * decrunching. Thus it should be a lot shorter and faster. I replaced   *
  685. * stack usage completely with register usage and I hope I catched all    *
  686. * the stuff and did not miss any obsolete code.                *
  687. *                                    *
  688. *    gets following parameters:                    *
  689. *        A4    source buffer                    *
  690. *        A2    destination buffer                *
  691. *************************************************************************
  692.  
  693. DecompFALH    CLR.L    D5            * current destination size
  694.         MOVEQ    #$10,D7
  695.         MOVE.L    4(A4),A3        * source size
  696.         MOVE.L    8(A4),D0        * packed size
  697.         LEA    14(A4),A4        * source buffer
  698.         LEA    (A4,D0.L),A6        * pack buffer end - part 1
  699.         MOVE.L    (A4)+,D6
  700.  
  701. FALH01        CLR.L    D4
  702.         SUBA.L    A5,A5
  703.         MOVEQ    #1,D0
  704.         BSR.W    FALHsub
  705.         TST.L    D0
  706.         BNE.B    FALH05
  707.         MOVEQ    #1,D1
  708.         MOVEQ    #2,D2
  709. FALH02        ADDQ.W    #1,D1
  710.         ASL.W    #1,D2
  711.         MOVE.L    D1,D0
  712.         BSR.W    FALHsub
  713.         ADD.L    D0,D4
  714.         TST.L    D0
  715.         BNE.B    FALH03
  716.         ADD.L    D2,D4
  717.         SUBQ.L    #1,D4
  718.         BRA.B    FALH02
  719. FALH03        CMP.L    A3,D5            * end reached ?
  720.         BCC.W    FALHend
  721.         MOVE.B    (A6)+,(A2,D5.L)
  722.         ADDQ.L    #1,D5
  723. FALH04        SUBQ.L    #1,D4
  724.         BNE.B    FALH03
  725. FALH05        MOVEQ    #2,D0
  726.         BSR.W    FALHsub
  727.         ADDQ.W    #1,D0
  728.         MOVE.L    D0,D3
  729.         CMPI.L    #2,D0
  730.         BNE.B    FALH06
  731.         MOVE.W    #2,A5        * 32 bit MOVE also with .W !!!
  732.         MOVEQ    #8,D0
  733.         BSR.W    FALHsub
  734.         MOVE.L    D0,D1
  735.         BRA.B    FALH11
  736. FALH06        MOVE.L    D3,A5
  737.         CMPI.L    #1,D3
  738.         BNE.B    FALH09
  739.         ADDQ.L    #3,A5
  740.         MOVEQ    #2,D1
  741.         MOVEQ    #4,D2
  742. FALH07        ADDQ.W    #1,D1
  743.         ASL.W    #1,D2
  744.         MOVE.L    D1,D0
  745.         BSR.B    FALHsub
  746.         MOVE.L    D0,D3
  747.         BNE.B    FALH08
  748.         ADD.L    D2,D0
  749.         SUBQ.L    #1,D0
  750. FALH08        ADD.L    D0,A5
  751.         TST.L    D3
  752.         BEQ.B    FALH07
  753. FALH09        MOVEQ    #3,D0
  754.         BSR.B    FALHsub
  755.         TST.L    D0
  756.         BNE.B    FALH10
  757.         MOVEQ    #5,D0
  758.         BSR.B    FALHsub
  759.         MOVE.L    D0,D1
  760.         MOVEQ    #1,D0
  761.         BSR.B    FALHsub
  762.         TST.L    D0
  763.         BEQ.B    FALH11
  764.         ADDI.L    #$00000020,D1
  765.         BRA.B    FALH11
  766. FALH10        MOVE.L    D0,D1
  767.         ADD.L    D1,D1
  768.         LEA    FALHData(PC),A0
  769.         MOVE.W    (A0,D1.L),D2
  770.         ADDQ.W    #5,D0
  771.         BSR.B    FALHsub
  772.         ADD.L    D2,D0
  773.         MOVE.L    D0,D1
  774.         BEQ.B    FALHend
  775. FALH11        MOVE.L    D5,D3
  776.         LEA    (A2,D3.L),A1
  777.         SUB.L    D1,D3
  778.         LEA    (A2,D3.L),A0
  779. FALH12        CMP.L    A3,D5            * end reached ?
  780.         BCC.B    FALHend
  781.         MOVE.L    A5,D0
  782.         BEQ.B    FALHend
  783.         SUBQ.L    #1,A5
  784.         MOVE.B    (A0)+,(A1)+
  785.         ADDQ.L    #1,D5
  786.         BRA.B    FALH12
  787. FALHend        CMP.L    A3,D5            * end reached ?
  788.         BLT.W    FALH01
  789.         RTS
  790.  
  791.         * uses variables D6 and D7, returns D0
  792. FALHsub        MOVEM.L    D1-D4,-(A7)
  793.         MOVE.L    D6,D1
  794.         SUBQ.W    #1,D0
  795.         MOVEQ    #0,D2
  796. FALHsub1    ADD.L    D1,D1
  797.         ADDX    D2,D2
  798.         SUBQ.L    #1,D7
  799.         BNE.B    FALHsub2
  800.         MOVE.W    (A4)+,D4
  801.         MOVEQ    #$10,D7
  802.         OR.W    D4,D1
  803. FALHsub2    DBRA    D0,FALHsub1
  804.         MOVE.L    D2,D0
  805.         MOVE.L    D1,D6
  806.         MOVEM.L    (A7)+,D1-D4
  807.         RTS    
  808.  
  809. FALHData    DC.W    $20,$40,$80,$100,$200,$400,$800,$1000
  810.  
  811. *************************************************************************
  812. *         checksum CRC-16 calculation routine             *
  813. *                                    *
  814. * This is made of reassembled code from PCompress2 and P-Reader.    *
  815. * I optimized the code a lot and is real assembler now.    :-)        *
  816. *                                    *
  817. *    gets following parameters:                    *
  818. *        A2    buffer                        *
  819. *            D4    buffersize                    *
  820. *    returns D0:    checksum (WORD)                    *
  821. *************************************************************************
  822.  
  823. GetCheckSum    MOVEM.L    D2/D4/A2,-(A7)
  824.         LEA    -$200(A7),A7        * get work space
  825.  
  826.         MOVEQ    #0,D1
  827.         ST    D1            * set $FF
  828. .Loop1        MOVE.W    D1,D0
  829.         MOVEQ    #7,D2
  830. .Loop2        LSR.W    #1,D0
  831.         BCC.B    .Loop2End        * is shifted bit 1 ?
  832.         EORI.W    #$A001,D0
  833. .Loop2End    DBRA    D2,.Loop2
  834.         MOVE.W    D1,D2
  835.         ASL.L    #1,D2
  836.         MOVE.W    D0,(A7,D2.W)
  837.         DBRA    D1,.Loop1
  838.  
  839.         MOVEQ    #0,D0
  840. .SumLoop    MOVE.B    (A2)+,D1
  841.         EOR.B    D1,D0
  842.         MOVEQ    #0,D1
  843.         MOVE.B    D0,D1
  844.         ASL.W    #1,D1
  845.         LSR.W    #8,D0
  846.         MOVE.W    (A7,D1.W),D1
  847.         EOR.W    D1,D0
  848.         SUBQ.L    #1,D4
  849.         BNE.B    .SumLoop
  850.         LEA    $200(A7),A7        * free work space
  851.         MOVEM.L    (A7)+,D2/D4/A2
  852.         RTS    
  853.         END
  854.